﻿using System;
using System.Collections.Generic;
using Neturion.Dados;
using Neturion.IRepositorios;
using Neturion.Repositorios;
using Neturion.Utils;

namespace Neturion.Negocios
{
    /// <summary>
    /// 
    /// </summary>
    public class NegocioOrgaoExpedidor
    {
        private IRepositorioOrgaoExpedidor _repositorioOrgaoExpedidor;

        /// <summary>
        /// 
        /// </summary>
        public NegocioOrgaoExpedidor()
        {
            _repositorioOrgaoExpedidor = new RepositorioOrgaoExpedidor();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="orgaoExpedidor"></param>
        /// <returns></returns>
        public OrgaoExpedidor Inserir(OrgaoExpedidor orgaoExpedidor)
        {
            orgaoExpedidor.Codigo = GeradorCodigo.GerarCodigo(1);
            orgaoExpedidor.Codigo += (_repositorioOrgaoExpedidor.ObterUltimoIdCodigoInteiro() + 1).ToString();
            orgaoExpedidor.Codigo += GeradorCodigo.GerarCodigo(1, orgaoExpedidor.Codigo);
            return _repositorioOrgaoExpedidor.Inserir(orgaoExpedidor);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="orgaoExpedidor"></param>
        /// <returns></returns>
        public OrgaoExpedidor Atualizar(OrgaoExpedidor orgaoExpedidor)
        {
            return _repositorioOrgaoExpedidor.Atualizar(orgaoExpedidor);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="orgaoExpedidor"></param>
        public void Excluir(OrgaoExpedidor orgaoExpedidor)
        {
            OrgaoExpedidor orgaoExpedidorTmp = ObterPorId(orgaoExpedidor.OrgaoExpedidorId);
            _repositorioOrgaoExpedidor.Excluir(orgaoExpedidorTmp);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public IList<OrgaoExpedidor> ObterTodos()
        {
            return _repositorioOrgaoExpedidor.ObterTodos();
        }

        public IList<OrgaoExpedidor> ObterTodos(int inicio, int quantidade, int quantidadeMinima, Usuario usuarioPermissao, string codigo, string sigla, string descricao, DateTime? inicioVigenciaDe, DateTime? inicioVigenciaAte, DateTime? fimVigenciaDe,
            DateTime? fimVigenciaAte)
        {
            if (!inicioVigenciaAte.HasValue)
            {
                inicioVigenciaAte = inicioVigenciaDe;
            }

            if (!fimVigenciaAte.HasValue)
            {
                fimVigenciaAte = fimVigenciaDe;
            }
            //Falta Implementar Regra de Negócio do Usuário, tratar posteriormente! 
            return _repositorioOrgaoExpedidor.ObterTodos(inicio, quantidade, quantidadeMinima, codigo, sigla, descricao, inicioVigenciaDe, inicioVigenciaAte, fimVigenciaDe, fimVigenciaAte);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public OrgaoExpedidor ObterPorId(int id)
        {
            return _repositorioOrgaoExpedidor.ObterPorId(id);
        }

        /// <summary>
        /// Obter Orgão Expeditor por Sigla
        /// </summary>
        /// <param name="usuario"></param>
        /// <param name="sigla"></param>
        /// <returns></returns>
        
        public OrgaoExpedidor ObterPorCodigo(Usuario usuario, string codigo)
        {
            return _repositorioOrgaoExpedidor.ObterPorCodigo(codigo);
        }
        
        public OrgaoExpedidor ObterPorSigla(Usuario usuario, string sigla)
        {
            return _repositorioOrgaoExpedidor.ObterPorSigla(sigla);
        }

        public IList<OrgaoExpedidor> ObterPorDescricao(int inicio, int quantidade, int quantidadeMinima, Usuario usuario, string descricao)
        {
            return _repositorioOrgaoExpedidor.ObterPorDescricao(inicio, quantidade, quantidadeMinima,descricao);
        }
    }
}